package com.shujia.opt

import org.apache.spark.sql.{DataFrame, SparkSession}

object Demo6Join {
  def main(args: Array[String]): Unit = {
    val sparkSession: SparkSession = SparkSession.builder()
      .master("local")
      .appName("spark sql使用广播变量")
      .config("spark.sql.shuffle.partitions", "1")
      .getOrCreate()

    import org.apache.spark.sql.functions._
    import sparkSession.implicits._

    val studentsDF: DataFrame = sparkSession.read
      .format("csv")
      .option("seq", ",")
      .schema("id STRING,name STRING,age INT,gender STRING,clazz STRING")
      .load("spark/data/students.txt")

    val scoresDF: DataFrame = sparkSession.read
      .format("csv")
      .option("seq", ",")
      .schema("id STRING,subject_id STRING,score INT")
      .load("spark/data/score.txt")


    /**
     * 如果在spark sql中是两个DF进行join关联的话，并且运行模式是local模式的话，会自动地将关联的DF进行广播
     * 如果不是local模式，不会自动进行，需要手动将要广播的DF给广播出去
     *
     * 广播大变量，1G的变量
     *
     *
     * 会进行两次job作业
     * 第一次是将关联的DF广播
     * 第二次是使用广播的DF进行关联
     */
    val resDF: DataFrame = scoresDF.join(studentsDF.hint("broadcast"), "id")

    resDF.show()
    while (true){

    }
  }
}
